/******************************************************************************
 * Qwt Widget Library
 * Copyright (C) 1997   Josef Wilgen
 * Copyright (C) 2002   Uwe Rathmann
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the Qwt License, Version 1.0
 *****************************************************************************/

#ifndef QWT_CURVE_FITTER_H
#define QWT_CURVE_FITTER_H

#include "qwt_global.h"

class QPainterPath;
class QPolygonF;

/*!
   \brief Abstract base class for a curve fitter
 */
class QWT_EXPORT QwtCurveFitter
{
public:
  /*!
     \brief Preferred mode of the fitting algorithm

     Even if a QPainterPath can always be created from a QPolygonF
     the overhead of the conversion can be avoided by indicating
     the preference of the implementation to the application
     code.
   */
  enum Mode
  {
    /*!
       The fitting algorithm creates a polygon - the implementation
       of fitCurvePath() simply wraps the polygon into a path.

       \sa QwtWeedingCurveFitter
     */
    Polygon,

    /*!
       The fitting algorithm creates a painter path - the implementation
       of fitCurve() extracts a polygon from the path.

       \sa QwtSplineCurveFitter
     */
    Path
  };

  virtual ~QwtCurveFitter();

  Mode mode() const;

  /*!
      Find a curve which has the best fit to a series of data points

      \param polygon Series of data points
      \return Curve points

      \sa fitCurvePath()
   */
  virtual QPolygonF fitCurve(const QPolygonF &polygon) const = 0;

  /*!
      Find a curve path which has the best fit to a series of data points

      \param polygon Series of data points
      \return Curve path

      \sa fitCurve()
   */
  virtual QPainterPath fitCurvePath(const QPolygonF &polygon) const = 0;

protected:
  explicit QwtCurveFitter(Mode mode);

private:
  Q_DISABLE_COPY(QwtCurveFitter)

  const Mode m_mode;
};

#endif
